#version 330 core
out vec4 FragColor; //输出颜色
in vec3 Normal; //输入法向量
uniform vec3 objectColor; //物体颜色
uniform vec3 lightColor; //光颜色
uniform vec3 lightPos; //光源位置
uniform vec3 viewPos; //观察者（摄像机）的位置
in vec3 FragPos; //顶点的世界空间坐标

//漫反射光照
void diffuseReflection(){
 //环境光照,使用一个很小的常量（光照）颜色，添加到物体片段的最终颜色中，这样子的话即便场景中没有直接的光源也能看起来存在有一些发散的光
   float ambientStrength = 0.1;
   vec3 ambient = ambientStrength * lightColor;

   vec3 norm = normalize(Normal); //法向量
   vec3 lightDir = normalize(lightPos - FragPos); //光照在当前位置时的方向（取反方向，反方向与法线的夹角才是锐角）

    //对norm和lightDir向量进行点乘，计算光源对当前片段实际的漫发射影响（计算当前位置实际得到的光线大小，就是两个单位向量的余弦值）
    //如果两个向量之间的角度大于90度，点乘的结果就会变成负数，这样会导致漫反射分量变为负数。为此，我们使用max函数返回两个参数之间较大的参数，从而保证漫反射分量不会变成负数。负数颜色的光照是没有定义的，所以最好避免它，除非你是那种古怪的艺术家。
   float diff = max(dot(norm, lightDir), 0.0);

   vec3 diffuse = diff * lightColor; //光的颜色乘以当前位置得到的光线的比例（漫反射分量）

   vec3 result = (ambient + diffuse) * objectColor;//实际得到的光的颜色 与 物体的颜色叉乘得到最终表现出来的颜色
   FragColor = vec4(result, 1.0);
}
//镜面反射光照
void specularReflection (){
   //环境光照,使用一个很小的常量（光照）颜色，添加到物体片段的最终颜色中，这样子的话即便场景中没有直接的光源也能看起来存在有一些发散的光
   float ambientStrength = 0.1;
   vec3 ambient = ambientStrength * lightColor; //环境光照分量


   vec3 norm = normalize(Normal); //法向量
   vec3 lightDir = normalize(lightPos - FragPos); //光照在当前位置时的方向（取反方向，反方向与法线的夹角才是锐角）
   float diff = max(dot(norm, lightDir), 0.0);
   vec3 diffuse = diff * lightColor;//漫反射分量

    //定义一个镜面强度(Specular Intensity)变量，给镜面高光一个中等亮度颜色，让它不要产生过度的影响
    float specularStrength = 0.5;


    //摄像机位置-物体当前位置 = 物体当前位置指向摄像的一个向量
    vec3 viewDir = normalize(viewPos - FragPos);
    //反射光的方向 （我们对lightDir向量进行了取反。reflect函数要求第一个向量是从光源指向片段位置的向量，但是lightDir当前正好相反，是从片段指向光源（由先前我们计算lightDir向量时，减法的顺序决定））
    vec3 reflectDir = reflect(-lightDir, norm);

    //计算镜面分量
    //先计算视线方向与反射方向的点乘（并确保它不是负值），然后取它的32次幂。这个32是高光的反光度(Shininess)。一个物体的反光度越高，反射光的能力越强，散射得越少，高光点就会越小
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
    vec3 specular = specularStrength * spec * lightColor; //镜面光照分量

    vec3 result = (ambient + diffuse + specular) * objectColor;
    FragColor = vec4(result, 1.0);
}

void main()
{
    //diffuseReflection();//漫反射光照
    specularReflection(); //镜面光照

}